#include "widget.h"
#include "ui_widget.h"

#include <QWebFrame>
#include <QPainter>
#include <QFile>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    connect(ui->webView, SIGNAL(loadFinished(bool)), this, SLOT(OnLoadFinished(bool)));
    connect(ui->webView->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(OnJavaScriptWindowObjectCleared()));
    // 不要使用这种方式加载
    ui->webView->setUrl(QUrl("http://www.baidu.com"));
    // 可以使用file协议加载
    //ui->webView->setUrl(QUrl("file:///D:/temp/Qt/TestWebView/html/test_call_js.html"));

//    QFile file(":/html/test_call_js.html");
//    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
//        qDebug(file.errorString().toStdString().c_str());
//        return;
//    }
//    QString content = file.readAll();
//    file.close();
//    ui->webView->setHtml(content);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::OnLoadFinished(bool result)
{
    QString strUrl = ui->webView->url().toDisplayString();

    // render image
    if (result) {
        renderImage();
    }
    else{
        qDebug() << "load error";
    }
}

void Widget::on_btncalljs_clicked()
{
    CallJsFunction();
}

void Widget::OnJavaScriptWindowObjectCleared()
{
    ui->webView->page()->mainFrame()->addToJavaScriptWindowObject("Widget", new MyObject());
}

bool Widget::renderImage()
{
    // 获取当前页面的大小
    QSize contentSize = ui->webView->page()->mainFrame()->contentsSize();
    // 声明一张图片大小和页面一样大
    QImage image = QImage(contentSize, QImage::Format_RGB32);
    // 设置page的可视窗口大小和页面的一样
    ui->webView->page()->setViewportSize(contentSize);
    QPainter painter(&image);
    // 绘制到painter上
    ui->webView->page()->mainFrame()->render(&painter);
    painter.end();
    // 保存
    image.save("D:\\test_web_render.png");
    return true;
}

void Widget::CallJsFunction()
{
    ui->webView->page()->mainFrame()->evaluateJavaScript("jsFun(\"json format data\")");
}
